package com.atguigu03.stream;

import com.atguigu02.reference.data.Employee;
import com.atguigu02.reference.data.EmployeeData;
import jdk.nio.mapmode.ExtendedMapMode;
import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 测试Stream的终止操作
 *
 * @author 尚硅谷-宋红康
 */
public class StreamAPITest2 {

    //1-匹配与查找
    @Test
    public void test1(){
//        allMatch(Predicate p)——检查是否匹配所有元素。
//          练习：是否所有的员工的年龄都大于18
        System.out.println(EmployeeData.getEmployees().stream().allMatch(employee -> employee.getAge() > 18));
//        anyMatch(Predicate p)——检查是否至少匹配一个元素。
//         练习：是否存在员工的工资大于 10000
        System.out.println(EmployeeData.getEmployees().stream().anyMatch(emp -> emp.getSalary() > 10000));

//        findFirst——返回第一个元素
        System.out.println(EmployeeData.getEmployees().stream().findFirst().get());


    }

    @Test
    public void test2(){
        // count——返回流中元素的总个数
        System.out.println(EmployeeData.getEmployees().stream().count());
//        max(Comparator c)——返回流中最大值
//        练习：返回最高的工资：
        System.out.println(EmployeeData.getEmployees().stream().max((emp1, emp2) -> Double.compare(emp1.getSalary(), emp2.getSalary())).get());
//        min(Comparator c)——返回流中最小值
//        练习：返回最低工资的员工
        System.out.println(EmployeeData.getEmployees().stream().min((emp1, emp2) -> Double.compare(emp1.getSalary(), emp2.getSalary())).get());

//        forEach(Consumer c)——内部迭代
        EmployeeData.getEmployees().stream().forEach(System.out::println);

    }

    //2-归约
    @Test
    public void test3(){
//        reduce(T identity, BinaryOperator)——可以将流中元素反复结合起来，得到一个值。返回 T
//        练习1：计算1-10的自然数的和
        int[] i ={1,2,3,4,5,6,7,8,9,10};
        System.out.println("结果是"+Arrays.stream(i).reduce((x1, x2) -> x1 + x2));
        System.out.println("结果是"+Arrays.stream(i).reduce((x1, x2) ->Integer.sum(x1,x2)));
        System.out.println("结果是"+Arrays.stream(i).reduce(Integer ::sum));

//        reduce(BinaryOperator) ——可以将流中元素反复结合起来，得到一个值。返回 Optional<T>
//        练习2：计算公司所有员工工资的总和
        System.out.println(EmployeeData.getEmployees().stream().map((emp -> emp.getSalary())).reduce(Double::sum));
    }

    //3-收集
    @Test
    public void test4(){
//        collect(Collector c)——将流转换为其他形式。接收一个 Collector接口的实现，用于给Stream中元素做汇总的方法
//        练习1：查找工资大于6000的员工，结果返回为一个List或Set
        List<Employee> list= EmployeeData.getEmployees().stream().filter(employee -> employee.getSalary() > 6000).collect(Collectors.toList());

//        练习2：按照员工的年龄进行排序，返回到一个新的List中
        List<Employee> newList = EmployeeData.getEmployees().stream().sorted((emp1, emp2) -> emp1.getAge() - emp2.getAge()).collect(Collectors.toList());
        for (Employee a : newList
             ) {
            System.out.println(a.toString());

        }
    }
}
